package com.coffee.sku.service.sku.impl;

import com.coffee.core.entity.Page;
import com.coffee.core.entity.PagerInfo;
import com.coffee.core.enums.ExceptionEnum;
import com.coffee.core.exception.BusinessException;
import com.coffee.core.util.BeanUtilExt;
import com.coffee.core.util.DTOUtils;
import com.coffee.core.util.StringUtil;
import com.coffee.order.service.sku.bean.EnjoyBeforePaySku;
import com.coffee.order.service.sku.dao.EnjoyBeforePaySkuDao;
import com.coffee.sku.api.sku.query.RegionalSkuSalesInformationQuery;
import com.coffee.sku.api.sku.query.SkuShopcarQuery;
import com.coffee.sku.api.sku.result.SkuCarListResult;
import com.coffee.sku.api.sku.result.SkuShopcarResult;
import com.coffee.sku.api.sku.service.SkuContentService;
import com.coffee.sku.api.sku.service.SkuShopcarService;
import com.coffee.sku.service.sku.bean.*;
import com.coffee.sku.service.sku.dao.*;
import org.apache.dubbo.config.annotation.DubboService;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;


@DubboService(dynamic = true)
public class SkuShopcarServiceImpl implements SkuShopcarService {
    @Resource
    private SkuShopcarDao skuShopcarDao;
    @Resource
    private SkuContentDao skuContentDao;
    @Resource
    private SkuSalesInformationDao skuSalesInformationDao;
    @Resource
    private RegionalSkuSalesInformationDao regionalSkuSalesInformationDao;
    @Resource
    private RegionalSkuDao regionalSkuDao;
    @Resource
    private EnjoyBeforePaySkuDao enjoyBeforePaySkuDao;

    @Override
    public Page<SkuShopcarResult> getPager(SkuShopcarQuery param, PagerInfo pr) {
        Page<SkuShopcarResult> pager = new Page<SkuShopcarResult>(pr.getStart(), pr.getPageSize());
        Integer count = skuShopcarDao.count(param);

        pager.setTotalPage(count);
        if (count > 0) {
            List<SkuShopcar> list = skuShopcarDao.page(param, pr.getStart(), pr.getPageSize());
            pager.setData(DTOUtils.convertList(list, SkuShopcarResult.class));
        }
        return pager;
    }

    @Override
    public Integer count(SkuShopcarQuery param) {
        Integer count = skuShopcarDao.count(param);
        return count;
    }

    @Override
    public SkuShopcarResult getDetail(Integer id) {
        SkuShopcar item = skuShopcarDao.findById(id);
        if (item == null) {
            return null;
        }
        SkuShopcarResult result = new SkuShopcarResult();
        BeanUtilExt.copyProperties(result, item);

        return result;
    }


    @Override
    public List<SkuCarListResult> getSkuShopcarResult(Integer merchantId, Integer cityId) {
        List<SkuCarListResult> skuCarListResult = skuShopcarDao.getSkuCarListResult(merchantId);
        if (skuCarListResult.size() <= 0) {
            return skuCarListResult;
        }
        for (SkuCarListResult carListResult : skuCarListResult) {
            if ("Y".equals(carListResult.getIsEnable())
                    && "N".equals(carListResult.getIsDisable()) && "Y".equals(carListResult.getIsApprove())
                    && carListResult.getStock() > 0) {
                carListResult.setIsValid("Y");
            }
            if (cityId != null) {
                RegionalSku regionalSku = regionalSkuDao.findBySkuId(carListResult.getSkuId());
                if (regionalSku!=null){
                    carListResult.setIsMembersExclusive(regionalSku.getIsMembersExclusive());
                }
                RegionalSkuSalesInformationQuery param = new RegionalSkuSalesInformationQuery();
                param.setSkuSalesInformationId(carListResult.getSkuSalesInformationId());
                param.setGtRegionId(cityId);
                RegionalSkuSalesInformation first = regionalSkuSalesInformationDao.findFirst(param);
                if (first != null) {
                    carListResult.setPrice(first.getRegionalPrice());
                }
            }
            EnjoyBeforePaySku enjoyBeforePaySku = enjoyBeforePaySkuDao.findBySkuId(carListResult.getSkuId());
            if (enjoyBeforePaySku != null) {
                carListResult.setIsEnjoy("Y");
            }

        }
        List<SkuCarListResult> collect = skuCarListResult.stream()
                .sorted(Comparator.comparing(SkuCarListResult::getIsValid).reversed()
                        .thenComparing(SkuCarListResult::getId).reversed())
                .collect(Collectors.toList());
        return collect;
    }

    @Override
    public List<SkuShopcarResult> getList(SkuShopcarQuery param, PagerInfo pr) {
        List<SkuShopcar> list = skuShopcarDao.page(param, pr.getStart(), pr.getPageSize());
        return DTOUtils.convertList(list, SkuShopcarResult.class);
    }

    @Override
    public List<SkuShopcarResult> getList(SkuShopcarQuery param) {
        List<SkuShopcar> list = skuShopcarDao.page(param, 0, Integer.MAX_VALUE);
        return DTOUtils.convertList(list, SkuShopcarResult.class);
    }

    @Override
    public List<SkuShopcarResult> getList() {
        SkuShopcarQuery param = new SkuShopcarQuery();
        List<SkuShopcar> list = skuShopcarDao.page(param, 0, Integer.MAX_VALUE);
        return DTOUtils.convertList(list, SkuShopcarResult.class);
    }


    @Override
    public void delete(List<Integer> id, Integer merchantId) {
        skuShopcarDao.deleteByIds(id, merchantId);
    }

    @Override
    public void addOrUpdate(SkuShopcarResult result) throws BusinessException {
        SkuShopcar item = new SkuShopcar();
        BeanUtilExt.copyProperties(item, result);
        if (item.getId() == null) {
            SkuContent skuContent = skuContentDao.findBySkuId(result.getSkuId());
            if ("Y".equals(skuContent.getIsSpellOrder())) {
                throw new BusinessException(ExceptionEnum.ERROR_1707.getCode(), ExceptionEnum.ERROR_1707.getMessage());
            }
            SkuSalesInformation skuSalesInformation = skuSalesInformationDao.findById(result.getSkuSalesInformationId());
            SkuShopcarQuery param = new SkuShopcarQuery();
            param.setMerchantId(result.getMerchantId());
            param.setSkuId(result.getSkuId());
            param.setSkuSalesInformationId(result.getSkuSalesInformationId());
            SkuShopcar skuShopcar = skuShopcarDao.findFirst(param);
            if (skuShopcar != null) {
                SkuShopcar update = new SkuShopcar();
                update.setId(skuShopcar.getId());
                update.setMerchantId(result.getMerchantId());
                int count = skuShopcar.getCount() + result.getCount();
                update.setCount(count > skuSalesInformation.getStock() ? skuSalesInformation.getStock() : count);
                skuShopcarDao.updateById(update);
            } else {
                item.setCreateTime(new Date());
                item.setCount(result.getCount() > skuSalesInformation.getStock() ? skuSalesInformation.getStock() : result.getCount());
                skuShopcarDao.insert(item);
            }
        } else {
            SkuShopcar tmp = skuShopcarDao.findById(item.getId());
            if (tmp == null) {
                throw new BusinessException(ExceptionEnum.ERROR_0002.getCode(), ExceptionEnum.ERROR_0002.getMessage());
            }
            skuShopcarDao.updateById(item);
        }
    }

    @Override
    public Map<Integer, SkuShopcarResult> getItemMap(Set<Integer> idSet) {
        Map<Integer, SkuShopcarResult> map = new HashMap<Integer, SkuShopcarResult>();
        List<SkuShopcar> list = skuShopcarDao.findByIds(StringUtil.setToList(idSet));
        List<SkuShopcarResult> resultList = DTOUtils.convertList(list, SkuShopcarResult.class);
        for (SkuShopcarResult item : resultList) {
            map.put(item.getId(), item);
        }
        return map;
    }

    @Override
    public Map<Integer, SkuShopcarResult> getItemMap() {
        Map<Integer, SkuShopcarResult> map = new HashMap<Integer, SkuShopcarResult>();
        SkuShopcarQuery param = new SkuShopcarQuery();
        List<SkuShopcar> list = skuShopcarDao.page(param, 0, Integer.MAX_VALUE);
        List<SkuShopcarResult> resultList = DTOUtils.convertList(list, SkuShopcarResult.class);
        for (SkuShopcarResult item : resultList) {
            map.put(item.getId(), item);
        }
        return map;
    }


}
